package com.zzyl.common.utils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

/**
 * 身份证工具类
 * 提供根据身份证号码获取性别、年龄、出生日期等信息的功能
 */
public class IdCardUtils {

    /**
     * 根据身份证号码获取性别
     *
     * @param idCard 身份证号码
     * @return 性别（0:男，1:女）
     */
    public static Integer getGender(String idCard) {
        if (idCard == null || idCard.trim().length() == 0) {
            return null;
        }

        // 18位身份证号码倒数第二位数字，奇数为男性，偶数为女性
        if (idCard.length() == 18) {
            char genderChar = idCard.charAt(16);
            return Integer.parseInt(String.valueOf(genderChar)) % 2 == 0 ? 1 : 0;
        }
        // 15位身份证号码倒数第二位数字，奇数为男性，偶数为女性
        else if (idCard.length() == 15) {
            char genderChar = idCard.charAt(14);
            return Integer.parseInt(String.valueOf(genderChar)) % 2 == 0 ? 1 : 0;
        }
        return null;
    }

    /**
     * 根据身份证号码获取年龄
     * @param idCard 身份证号码
     * @return 年龄
     */
    public static Integer getAge(String idCard) {
        String birthDate = getBirthDateString(idCard);
        if (birthDate == null || birthDate.isEmpty()) {
            return null;
        }

        LocalDate birth = LocalDate.parse(birthDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        LocalDate now = LocalDate.now();
        return (int) ChronoUnit.YEARS.between(birth, now);
    }

    /**
     * 根据身份证号码获取出生日期
     *
     * @param idCard 身份证号码
     * @return 出生日期
     */
    public static LocalDateTime getBirthDate(String idCard) {
        String birthDateStr = getBirthDateString(idCard);
        if (birthDateStr == null || birthDateStr.isEmpty()) {
            return null;
        }

        LocalDate date = LocalDate.parse(birthDateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        return date.atStartOfDay();
    }

    /**
     * 根据身份证号码获取出生日期字符串
     *
     * @param idCard 身份证号码
     * @return 出生日期（格式：yyyy-MM-dd）
     */
    private static String getBirthDateString(String idCard) {
        if (idCard == null || idCard.trim().length() == 0) {
            return "";
        }

        // 18位身份证号码
        if (idCard.length() == 18) {
            String year = idCard.substring(6, 10);
            String month = idCard.substring(10, 12);
            String day = idCard.substring(12, 14);
            return year + "-" + month + "-" + day;
        }
        // 15位身份证号码
        else if (idCard.length() == 15) {
            String year = "19" + idCard.substring(6, 8);
            String month = idCard.substring(8, 10);
            String day = idCard.substring(10, 12);
            return year + "-" + month + "-" + day;
        }
        return "";
    }

    /**
     * 验证身份证号码格式是否正确
     * @param idCard 身份证号码
     * @return 是否有效
     */
    public static boolean isValidIdCard(String idCard) {
        if (idCard == null || idCard.trim().length() == 0) {
            return false;
        }

        // 验证长度是否为15或18位
        if (idCard.length() != 15 && idCard.length() != 18) {
            return false;
        }

        // 验证出生日期
        String birthDate = getBirthDateString(idCard);
        if (birthDate == null || birthDate.isEmpty()) {
            return false;
        }

        try {
            LocalDate.parse(birthDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        } catch (Exception e) {
            return false;
        }

        return true;
    }
}
